0x00 前言

这篇教程是基于ONOS Wiki上教程写的,Wiki上写的还是比较清楚的,但在实践过程中还是踩了一些坑,为了总结写下了这篇教程。
本教程的环境搭建是在分配有4核CPU、8G内存、运行ubuntu 18.04 desktop虚拟机上完成的。
建议搭建环境的主机至少分配4G内存,如果你使用其他版本的ubuntu,本教程也是适用的。

0x01 目录

0x02 前期准备

  • Git
  • JDK
  • Bazel

Git安装

sudo apt-get install git

JDK安装

ONOS-2.2以后的版本都使用JDK11,这里选择OpenJDK-11进行安装

# 安装OpenJDK-11
sudo apt-get install openjdk-11-jdk

# 配置环境变量
sudo gedit /etc/profile

# 在profile文件末尾添加下面的内容
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

# 查看配置是否成功,若显示openjdk version,则配置成功
java -version

参考:https://blog.csdn.net/EahanZhang/article/details/88085561

Bazel安装

Bazel是Google开发的用于编译的工具,在Github上选择bazel-0.27.1-installer-linux-x86_64.sh 进行下载
https://github.com/bazelbuild/bazel/releases/tag/0.27.1

注:
在我搭建环境的时候,参考的是ONOS Wiki于2019/6/19发布的教程,里面使用的是Bazel 0.27.0。
https://wiki.onosproject.org/pages/viewpage.action?pageId=28836246
我开始时使用了1.0.0但发现编译失败,于是换成0.27.1,经过测试该版本有效。
1.0.0编译失败的问题已于2019/10/16被ONOS官方解决,因此你也可以选择安装最新版本的Bazel。
https://github.com/opennetworkinglab/onos/commit/2bf24538098ce3d963d7cbe7da4dfbcfc69285e5

根据Bazel官网安装教程进行安装
https://docs.bazel.build/versions/master/install-ubuntu.html#install-with-installer-ubuntu

0x03 ONOS安装

下载ONOS源码

有以下两种方式,选择一种即可

Github上下载ONOS源码

ONOS源码目录改名

若选择从Github上下载ZIP压缩包,解压缩后得到onos-master目录,将其改名为onos,方便后续操作

mv onos-master onos

ONOS源码编译

cd onos
bazel build onos

当显示build success,说明编译成功

ONOS源码编译成功

注:由于网络原因,可能某些依赖下载不下来,导致编译失败,此时可以选择重新运行
bazel build onos,直到依赖下载成功

运行ONOS控制器

cd onos
bazel run onos-local

运行ONOS控制器

参考

https://wiki.onosproject.org/display/ONOS/Development+Environment+Setup

0x04 Mininet安装

源码下载

git clone git://github.com/mininet/mininet

安装

cd mininet/util/
sudo ./install.sh

测试

sudo mn --test pingall

mininet测试连通性

参考

http://mininet.org/download/

0x05 测试环境

这里ONOS和Mininet都部署在同一台主机中进行测试,当然你也可以选择分别部署在不同主机上。

运行ONOS

cd onos
bazel run onos-local

# 若想要删除ONOS上一次运行时产生的状态信息,则输入:
# bazel run onos-local -- clean

注:
1.运行ONOS之前,ONOS需要监听的端口号6653和6633有可能被其他进程占用,因此可以先检查一下端口使用情况:
sudo netstat -atnp | grep 6653
sudo netstat -atnp | grep 6633
若除java进程外,有其他进程占用端口号6653或6633,例如:ovs-testcontrol,则杀死进程:
sudo kill -9 <进程号>
2.ONOS启动后,最好等待窗口中不再弹出INFO信息后,再运行Mininet

ONOS启动后等待INFO消息不再弹出

运行ONOS Apps

ONOS开启后,默认不运行Reactive ForwardingBasic Pipelines应用程序,这样的话ONOS就无法处理2层和3层的转发,Mininet中主机之间无法ping通。因此在运行Mininet前,先运行这两个应用程序。下面介绍两种方法,选择其中一种即可

ONOS_WEB_GUI_打开应用程序选项卡

运行Basic Pipelines和Reactive Forwarding应用程序

ONOS_WEB_GUI_开启APP

  • ONOS CLI

    新开终端,输入

    onos/tools/test/bin/onos localhost

    打开ONOS命令行界面

    运行ONOS_CLI

    输入命令运行Basic Pipelines和Reactive Forwarding应用程序

    app activate org.onosproject.pipelines.basic
    app activate org.onosproject.fwd

    注:
    Basic Pipelines对应的应用程序ID为org.onosproject.pipelines.basic
    Reactive Forwarding对应的ID为org.onosproject.fwd

    ONOS_CLI运行应用程序

运行Mininet

新开终端,运行命令创建如下拓扑:

h1 - sw1 - h2

sudo mn --controller=remote,ip=127.0.0.1 --mac --switch=ovsk,protocols=OpenFlow13

# 如果ONOS和Mininet分别部署在不同主机上,则上面的IP地址改为ONOS所在主机的IP地址

检查ONOS与Mininet连通性

下面介绍两种判断ONOS与Mininet是否连通的方法

  • 若拓扑中显示设备,说明ONOS和Mininet中的交换机成功连接
    ONOS_WEB_GUI打开拓扑选项卡

  • 若ONOS与Mininet连通,运行ONOS的终端会显示下面的INFO信息
    ONOS与Mininet成功连接时应有的INFO消息
    ONOS与Mininet成功连接时应有的INFO消息-2

测试主机之间的连通性

在运行Mininet的终端上,输入

pingall

pingall测试连通性

参考

https://wiki.onosproject.org/display/ONOS/Basic+ONOS+Tutorial#BasicONOSTutorial-Setupyourenvironment

0x06 在IntelliJ IDEA中运行ONOS

下载IntelliJ IDEA

https://www.jetbrains.com/idea/download/#section=linux

下载IDEA

运行IntelliJ IDEA

解压缩IDEA后,cd到IDEA的bin目录,运行IDEA

./idea.sh

运行IDEA

安装Bazel插件

打开IDEA插件项
然后搜索Bazel并安装

导入ONOS源码并编译

生成最小的.bazelproject文件

cd onos/tools/dev/bin/
./onos-gen-bazel-project > /tmp/onos_bazelproject

IDEA导入ONOS源码-1

IDEA导入ONOS源码-2

IDEA导入ONOS源码-3

IDEA导入ONOS源码-4

等待IDEA完成ONOS源码的编译

运行ONOS

配置运行ONOS命令-1

配置运行ONOS命令-2

配置运行ONOS命令-3

配置运行ONOS命令-4

IDEA中运行ONOS-1

IDEA中运行ONOS-2

参考

https://wiki.onosproject.org/pages/viewpage.action?pageId=28836246



SDN     

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!